package corpo;

import excecoes.ValorDesconhecidoException;

/**
 * Cont�m os poss�veis valores que um usu�rio atribuir� a um estabelecimento para denotar sua qualidade. Cada valor possui seu inteiro correspondente, entre -5 e 5, e sua forma em String. Foram adicionados m�todos para facilitar a convers�o de um inteiro (correspondente � opini�o do usu�rio) em um objeto desta enumera��o.
 * 
 * @author Pedro Augustus Diniz Falc�o Silva
 *
 */
public enum QualidadeEstabelecimento {
	EXCELENTE("Excelente", 5),
	OTIMO("Otimo", 4),
	EXTRAORDINARIO("Extra-ordinario", 3),
	MUITOBOM("Muito bom", 2),
	BOM("Bom", 1),
	DESCONHECIDO("Desconhecido", 0),
	REGULAR("Regular", -1),
	RUIM("Ruim", -2),
	MUITORUIM("Muito ruim", -3),
	HORRIVEL("Horrivel", -4),
	REPUGNANTE("Repugnante", -5);
	
	private final String qualidade;
	private final int nota;
	
	private QualidadeEstabelecimento(String qualidade, int nota) {
		this.qualidade = qualidade;
		this.nota = nota;
	}
	
	/**
	 * Retorna uma representa��o do valor em quest�o em forma de String.
	 */
	public String toString() {
		return qualidade;
	}
	
	/**
	 * Retorna o valor inteiro correspondente ao objeto QualidadeEstabelecimento em quest�o.
	 * @return O valor inteiro correspondente.
	 */
	public int toInt() {
		return nota;
	}
	
	/**
	 * Recebe um valor inteiro e retorna o objeto QualidadeEstabelecimento correspondente, caso este inteiro perten�a ao dom�nio [-5,5].
	 * @param nota O valor inteiro que represente a qualidade desejada.
	 * @return O Objeto QualidadeEstabelecimento correspondente ao inteiro passado. 
	 * @throws ValorDesconhecidoException caso o inteiro passado esteja fora do dom�nio [-5,5].
	 */
	public static QualidadeEstabelecimento toQualidade(int nota) throws ValorDesconhecidoException {
		if (nota < -5 || nota > 5) {
			throw new ValorDesconhecidoException("O numero passado esta fora do dominio[-5,5] !");
		} else {
			for (QualidadeEstabelecimento qe : QualidadeEstabelecimento.values()) {
				if (qe.toInt() == nota) {
					return qe;
				}
			}
			throw new ValorDesconhecidoException("Problema desconhecido!");
		}
	}
}
